package com.nehc.nettyserver.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Arrays;

/**
 * Web安全配置类
 * 基于Sa-Token的权限认证配置
 * 
 * @author NEHC
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    /**
     * 注册Sa-Token拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截器
        registry.addInterceptor(new SaInterceptor(handle -> {
            // 登录认证 -- 拦截所有需要登录的路由
            SaRouter.match("/**")
                // 排除允许匿名访问的接口
                .notMatch(
                    "/auth/login",        // 登录接口
                    "/auth/register",     // 注册接口
                    "/auth/isLogin",      // 检查登录状态
                    "/status/**",          // 服务器状态接口
                    "/v3/api-docs/**",     // API文档
                    "/swagger-ui/**",      // Swagger UI
                    "/swagger-resources/**", // Swagger资源
                    "/webjars/**",         // Swagger相关的webjars
                    "/actuator/**",        // 健康检查
                    "/h2-console/**",      // H2控制台
                    "/static/**",          // 静态资源
                    "/error"               // 错误页
                )
                // 检查登录状态
                .check(r -> StpUtil.checkLogin());
            
            // 角色认证 -- 拦截需要管理员权限的路由
            SaRouter.match("/admin/**", r -> StpUtil.checkRole("admin"));
            
            // 权限认证 -- 不同接口权限不同
            SaRouter.match("/messages/**", r -> StpUtil.checkPermission("message"));
            SaRouter.match("/notifications/**", r -> StpUtil.checkPermission("notification"));
        })).addPathPatterns("/**");
    }

    /**
     * Sa-Token整合JWT
     */
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }
    
    /**
     * CORS配置
     */
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*")); // 允许所有来源
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); // 允许的HTTP方法
        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "X-Requested-With")); // 允许的头信息
        configuration.setAllowCredentials(true); // 允许携带认证信息
        configuration.setMaxAge(3600L); // 预检请求的缓存时间
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration); // 对所有URL应用CORS配置
        return source;
    }
} 